package br.com.conciliador.cadastro.vo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Formula;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Proxy;
import org.hibernate.annotations.Type;

import br.com.conciliador.cadastro.vo.filtro.FiltroFatoVo;
import br.com.r2.util.tipodado.DataHora;
import br.com.r2.util.tipodado.Inteiro;
import br.com.r2.util.tipodado.InteiroLongo;
import br.com.r2.util.tipodado.Moeda;
import br.com.r2.util.tipodado.Texto;

@Entity
@Table(name = "FATO")
@Proxy(lazy = true)
public class FatoVo implements Serializable
{

   /**
    * 
    */
   private static final long serialVersionUID = -6337662436999325603L;

   @Id
   @Column(name = "ID")
   @GeneratedValue(generator = "InteiroSequenceGenerator")
   @GenericGenerator(name = "InteiroSequenceGenerator", strategy = "br.com.r2.util.tipodado.hibernate.generator.InteiroSequenceGenerator")
   @Type(type = "br.com.r2.util.tipodado.hibernate.InteiroLongoUT")
   private InteiroLongo codigo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_BANDEIRA")
   private BandeiraVo bandeiraVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_LOTEBANDEIRA")
   private LoteBandeiraVo loteBandeiraVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_PRODUTO")
   private ProdutoVo produtoVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_LOJA")
   private LojaVo lojaVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_DATACREDITO")
   private DatasVo dataCreditoVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_DATAVENDA")
   private DatasVo dataVendaVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_DATAPAGAMENTO")
   private DatasVo dataPagamentoVo;
   
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_DATACANCELAMENTO")
   private DatasVo dataCancelamentoVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_EMPRESA")
   private EmpresaVo empresaVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_NUMEROCARTAO")
   private CartaoVo cartaoVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_CONTABANCO")
   private ContaBancoVo contaBancoVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_STATUS")
   private StatusVo statusVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_NATUREZA")
   private NaturezaVo naturezaVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_CAPTURA")
   private CapturaVo capturaVo;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_CHAVEFATO")
   private ChaveFatoVo chaveFatoVo;

   @Column(name = "PROCESSAMENTO")
   @Type(type = "br.com.r2.util.tipodado.hibernate.DataHoraUT")
   private DataHora dataProcessamento;

   @Column(name = "VALOR_VENDA")
   @Type(type = "br.com.r2.util.tipodado.hibernate.MoedaUT")
   private Moeda valorVenda;

   @Column(name = "VALOR_LIQUIDO")
   @Type(type = "br.com.r2.util.tipodado.hibernate.MoedaUT")
   private Moeda valorLiquido;

   @Column(name = "VALOR_BRUTO")
   @Type(type = "br.com.r2.util.tipodado.hibernate.MoedaUT")
   private Moeda valorBruto;
   
   @Column(name = "VALOR_PAGO")
   @Type(type = "br.com.r2.util.tipodado.hibernate.MoedaUT")
   private Moeda valorPago;

   @Column(name = "VALOR_COMISSAO")
   @Type(type = "br.com.r2.util.tipodado.hibernate.MoedaUT")
   private Moeda valorComissao;

   //@Column(name = "TAXA_ADMINISTRACAO")
   //@Type(type = "br.com.r2.util.tipodado.hibernate.MoedaUT")
   //private Moeda taxaAdministracao;

   @Column(name = "VALOR_TXANTECIPACAO")
   @Type(type = "br.com.r2.util.tipodado.hibernate.MoedaUT")
   private Moeda valorTaxaAntecipacao;

   //@Column(name = "TAXA_ANTECIPACAO")
   //@Type(type = "br.com.r2.util.tipodado.hibernate.MoedaUT")
   //private Moeda TaxaAntecipacao;

   @Column(name = "NSU")
   @Type(type = "br.com.r2.util.tipodado.hibernate.InteiroUT")
   private Inteiro nsu;

   @Column(name = "AUTORIZACAO")
   @Type(type = "br.com.r2.util.tipodado.hibernate.TextoUT")
   private Texto autorizacao;

   @Column(name = "PARCELA")
   @Type(type = "br.com.r2.util.tipodado.hibernate.InteiroUT")
   private Inteiro parcela;

   @Column(name = "PLANO")
   @Type(type = "br.com.r2.util.tipodado.hibernate.InteiroUT")
   private Inteiro plano;
   
   @Formula("(CASE WHEN PARCELA = 1 AND PLANO = 1 AND DIM_PRODUTO IN (2,3,7) THEN '0A VISTA' WHEN PARCELA = 1 AND PLANO = 1 THEN '1ROTATIVO' ELSE '2PARCELA:' || lpad(PARCELA::CHAR(2),2,'0') END)")
   @Type(type = "br.com.r2.util.tipodado.hibernate.TextoUT")
   private Texto tipoPlano;

   @Formula("(CASE WHEN PARCELA = 1 AND PLANO = 1 THEN 'A VISTA' ELSE 'PARCELADO' END)")
   @Type(type = "br.com.r2.util.tipodado.hibernate.TextoUT")
   private Texto descricaoPlano;

   @Column(name = "NUMERO_RESUMO_VENDA")
   @Type(type = "br.com.r2.util.tipodado.hibernate.InteiroLongoUT")
   private InteiroLongo numeroResumoVenda;
   
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "DIM_REDE")
   private RedeAdquirenteVo redeAdquirenteVo;
   
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "EST_EMPRESA")
   private EstEmpresaVo estEmpresaVo;

//   @Column(name = "E_ESTORNO")
//   @Type(type = "br.com.r2.util.tipodado.hibernate.FlagUT")
//   private Flag flagEstorno;
//
//   @Column(name = "E_CASHBACK")
//   @Type(type = "br.com.r2.util.tipodado.hibernate.FlagUT")
//   private Flag flagCashBack;
//
//   @Column(name = "E_ANTECIPADO")
//   @Type(type = "br.com.r2.util.tipodado.hibernate.FlagUT")
//   private Flag flagAntecipado;

   @Transient
   private FiltroFatoVo filtro;
   
   @Transient
   private Moeda valorPagoAdministracao;
 
   @Transient
   private Moeda valorPagoAntecipacao;
   
   @Transient
   private Moeda valorTicketMedio;
   
   @Transient
   private EstLojaVo estLojaVo;
   
   @Transient
   private InteiroLongo sequencial;
   
   public LoteBandeiraVo getLoteBandeiraVo()
   {
      return loteBandeiraVo;
   }

   public void setLoteBandeiraVo(LoteBandeiraVo loteBandeiraVo)
   {
      this.loteBandeiraVo = loteBandeiraVo;
   }

   public ProdutoVo getProdutoVo()
   {
      return produtoVo;
   }

   public void setProdutoVo(ProdutoVo produtoVo)
   {
      this.produtoVo = produtoVo;
   }

   public LojaVo getLojaVo()
   {
      return lojaVo;
   }

   public void setLojaVo(LojaVo lojaVo)
   {
      this.lojaVo = lojaVo;
   }

   public EstLojaVo getEstLojaVo()
   {
	  return estLojaVo;
   }
   
   public void setEstLojaVo(EstLojaVo estLojaVo)
   {
	  this.estLojaVo = estLojaVo; 
   }
   
   public DatasVo getDataCreditoVo()
   {
      return dataCreditoVo;
   }

   public void setDataCreditoVo(DatasVo dataCreditoVo)
   {
      this.dataCreditoVo = dataCreditoVo;
   }

   public DatasVo getDataVendaVo()
   {
      return dataVendaVo;
   }

   public void setDataVendaVo(DatasVo dataVendaVo)
   {
      this.dataVendaVo = dataVendaVo;
   }

   public DatasVo getDataCancelamentoVo()
   {
      return dataCancelamentoVo;
   }

   public void setDataCancelamentoVo(DatasVo dataCancelamentoVo)
   {
      this.dataCancelamentoVo = dataCancelamentoVo;
   }

   public EmpresaVo getEmpresaVo()
   {
      return empresaVo;
   }

   public void setEmpresaVo(EmpresaVo empresaVo)
   {
      this.empresaVo = empresaVo;
   }

   public CartaoVo getCartaoVo()
   {
      return cartaoVo;
   }

   public void setCartaoVo(CartaoVo cartaoVo)
   {
      this.cartaoVo = cartaoVo;
   }

   public ContaBancoVo getContaBancoVo()
   {
      return contaBancoVo;
   }

   public void setContaBancoVo(ContaBancoVo contaBancoVo)
   {
      this.contaBancoVo = contaBancoVo;
   }

   public StatusVo getStatusVo()
   {
      return statusVo;
   }

   public void setStatusVo(StatusVo statusVo)
   {
      this.statusVo = statusVo;
   }

   public NaturezaVo getNaturezaVo()
   {
      return naturezaVo;
   }

   public void setNaturezaVo(NaturezaVo naturezaVo)
   {
      this.naturezaVo = naturezaVo;
   }

   public CapturaVo getCapturaVo()
   {
      return capturaVo;
   }

   public void setCapturaVo(CapturaVo capturaVo)
   {
      this.capturaVo = capturaVo;
   }

   public ChaveFatoVo getChaveFatoVo()
   {
      return chaveFatoVo;
   }

   public void setChaveFatoVo(ChaveFatoVo chaveFatoVo)
   {
      this.chaveFatoVo = chaveFatoVo;
   }

   public DataHora getDataProcessamento()
   {
      return dataProcessamento;
   }

   public void setDataProcessamento(DataHora dataProcessamento)
   {
      this.dataProcessamento = dataProcessamento;
   }

   public Moeda getValorVenda()
   {
      return valorVenda;
   }

   public void setValorVenda(Moeda valorVenda)
   {
      this.valorVenda = valorVenda;
   }

   public Moeda getValorLiquido()
   {
      return valorLiquido;
   }

   public void setValorLiquido(Moeda valorLiquido)
   {
      this.valorLiquido = valorLiquido;
   }

   public Moeda getValorBruto()
   {
      return valorBruto;
   }

   public void setValorBruto(Moeda valorBruto)
   {
      this.valorBruto = valorBruto;
   }

	public Moeda getValorPago() {
		return valorPago;
	}

	public void setValorPago(Moeda valorPago) {
		this.valorPago = valorPago;
	}

	public Moeda getValorComissao() {
		return valorComissao;
	}

	public void setValorComissao(Moeda valorComissao) {
		this.valorComissao = valorComissao;
	}

   public Moeda getValorTaxaAntecipacao()
   {
      return valorTaxaAntecipacao;
   }

   public void setValorTaxaAntecipacao(Moeda valorTaxaAntecipacao)
   {
      this.valorTaxaAntecipacao = valorTaxaAntecipacao;
   }

	public Moeda getValorPagoAdministracao()
	{
		return valorPagoAdministracao;
	}

	public void setValorPagoAdministracao(Moeda valorPagoAdministracao) 
	{
		this.valorPagoAdministracao = valorPagoAdministracao;
	}
	
	public Moeda getValorPagoAntecipacao() {
		return valorPagoAntecipacao;
	}

	public void setValorPagoAntecipacao(Moeda valorPagoAntecipacao) {
		this.valorPagoAntecipacao = valorPagoAntecipacao;
	}

	public Inteiro getNsu() {
		return nsu;
	}

	public void setNsu(Inteiro nsu) {
		this.nsu = nsu;
	}

	public Texto getAutorizacao() {
		return autorizacao;
	}

	public void setAutorizacao(Texto autorizacao) {
		this.autorizacao = autorizacao;
	}

	public Inteiro getParcela() {
		return parcela;
	}

	public void setParcela(Inteiro parcela) {
		this.parcela = parcela;
	}

	public Inteiro getPlano() {
		return plano;
	}

	public void setPlano(Inteiro plano) {
		this.plano = plano;
	}

	public InteiroLongo getNumeroResumoVenda() {
		return numeroResumoVenda;
	}

	public void setNumeroResumoVenda(InteiroLongo numeroResumoVenda) {
		this.numeroResumoVenda = numeroResumoVenda;
	}

//	public Flag getFlagEstorno() {
//		return flagEstorno;
//	}
//
//	public void setFlagEstorno(Flag flagEstorno) {
//		this.flagEstorno = flagEstorno;
//	}
//
//	public Flag getFlagCashBack() {
//		return flagCashBack;
//	}
//
//	public void setFlagCashBack(Flag flagCashBack) {
//		this.flagCashBack = flagCashBack;
//	}
//
//	public Flag getFlagAntecipado() {
//		return flagAntecipado;
//	}
//
//	public void setFlagAntecipado(Flag flagAntecipado) {
//		this.flagAntecipado = flagAntecipado;
//	}

	public InteiroLongo getCodigo() {
		return codigo;
	}

	public void setCodigo(InteiroLongo codigo) {
		this.codigo = codigo;
	}

	public BandeiraVo getBandeiraVo() {
		return bandeiraVo;
	}

	public void setBandeiraVo(BandeiraVo bandeiraVo) {
		this.bandeiraVo = bandeiraVo;
	}

	public FiltroFatoVo getFiltro() {
		return filtro;
	}

	public void setFiltro(FiltroFatoVo filtro) {
		this.filtro = filtro;
	}

	public Texto getTipoPlano() {
		return tipoPlano;
	}

	public void setTipoPlano(Texto tipoPlano) {
		this.tipoPlano = tipoPlano;
	}

	public Texto getDescricaoPlano() {
		return descricaoPlano;
	}

	public void setDescricaoPlano(Texto descricaoPlano) {
		this.descricaoPlano = descricaoPlano;
	}

	public DatasVo getDataPagamentoVo() {
		return dataPagamentoVo;
	}

	public void setDataPagamentoVo(DatasVo dataPagamentoVo) {
		this.dataPagamentoVo = dataPagamentoVo;
	}

   public Moeda getValorTicketMedio()
   {
      return valorTicketMedio;
   }

   public void setValorTicketMedio(Moeda valorTicketMedio)
   {
      this.valorTicketMedio = valorTicketMedio;
   }

   public RedeAdquirenteVo getRedeAdquirenteVo()
   {
      return redeAdquirenteVo;
   }

   public void setRedeAdquirenteVo(RedeAdquirenteVo redeAdquirenteVo)
   {
      this.redeAdquirenteVo = redeAdquirenteVo;
   }

   //public Moeda getTaxaAdministracao()
   //{
   //   return taxaAdministracao;
   //}

   //public void setTaxaAdministracao(Moeda taxaAdministracao)
   //{
   //   this.taxaAdministracao = taxaAdministracao;
   //}

   //public Moeda getTaxaAntecipacao()
   //{
   //   return TaxaAntecipacao;
   //}

   //public void setTaxaAntecipacao(Moeda taxaAntecipacao)
   //{
   //   TaxaAntecipacao = taxaAntecipacao;
   //}

   public EstEmpresaVo getEstEmpresaVo()
   {
      return estEmpresaVo;
   }

   public void setEstEmpresaVo(EstEmpresaVo estEmpresaVo)
   {
      this.estEmpresaVo = estEmpresaVo;
   }

   public InteiroLongo getSequencial()
   {
      return sequencial;
   }

   public void setSequencial(InteiroLongo sequencial)
   {
      this.sequencial = sequencial;
   }

}
